{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**通用最佳实践回顾**\n",
    "\n",
    "- `std::stack<T, Container>` 为基于容器的适配器，默认使用 `std::deque<T>`。仅暴露栈式接口（`push`/`pop`/`top`/`empty`/`size`），不是暴露底层容器的随机访问能力；若需遍历或其他操作，应改用底层容器自行封装。\n",
    "- 可通过第二模板参数自定义底层容器（如 `std::vector<T>`、`std::list<T>`）。选择依据：`std::vector` 提供紧凑连续存储但 `push/pop` 需偶尔扩容；`std::deque` 在末端扩容更稳定；`std::list` 支持稳定迭代器但空间开销大。\n",
    "- `std::stack` 仅支持后进先出操作，`pop()` 不返回值；须在 `pop()` 前调用 `top()` 获取元素。\n",
    "- 不支持直接遍历；若需调试或批量处理，可以暂存到另一结构或访问底层容器（C++23 提供 `container()` 成员返回引用）。\n",
    "- `std::stack` 任意操作前应通过 `empty()` 校验防止越界；在异常安全场景下建议使用 RAII 资源和异常回滚，而非仅依赖手动 `pop()`。\n",
    "- 对性能敏感的场景，应减少不必要的拷贝：使用 `emplace`（C++11）直接构造元素；对大型对象可使用 `std::unique_ptr` 等指针存放。\n",
    "- 在解析、回溯、求值等任务中常结合 `std::stack` 管理中间状态；若需要回看多个层级或进行随机访问，可能更适合 `std::vector` 或自定义结构。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "| 序号 | 工程场景                         | 文件名                       | 说明要点                                                     | 可运行示例代码           |\n",
    "| ---- | -------------------------------- | ---------------------------- | ------------------------------------------------------------ | ------------------------ |\n",
    "| 1    | 表达式求值 / 逆波兰 (RPN) 计算   | `stack_rpn_calculator.cpp`   | 利用 `std::stack<double>` 存储操作数；演示 `push`/`top`/`pop` 处理二元运算 | 示例 1：RPN 表达式求值   |\n",
    "| 2    | 语法解析 / 括号匹配 / 回溯 (DFS) | `stack_bracket_matching.cpp` | 使用 `std::stack<char>` 检测括号合法性；给出错误位置输出     | 示例 2：括号匹配检查     |\n",
    "| 3    | 解释器 / 虚拟机调用帧模拟        | `stack_vm_call_frames.cpp`   | 通过 `std::stack<Frame>` 模拟调用栈；展示函数调用/返回、帧信息打印 | 示例 3：虚拟机调用栈模拟 |\n",
    "| 4    | 资源 / 作用域管理（手动栈）      | `stack_resource_scope.cpp`   | 手动维护资源 ID 栈；进入/退出作用域时管理资源生命周期        | 示例 4：资源作用域管理栈 |"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "示例 1：RPN 表达式求值（stack_rpn_calculator.cpp）\n",
    "示例 2：括号匹配检查（stack_bracket_matching.cpp）\n",
    "示例 3：虚拟机调用栈模拟（stack_vm_call_frames.cpp）\n",
    "示例 4：资源作用域管理栈（stack_resource_scope.cpp）"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "C++17",
   "language": "C++17",
   "name": "xcpp17"
  },
  "language_info": {
   "name": "C++17"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
